package com.mjlf.mjatis.core;

import com.mjlf.mjatis.config.Configuration;
import com.mjlf.mjatis.core.SqlSession;

import java.io.IOException;
import java.io.InputStream;

/**
 * @ClassName SqlSessionFactory
 * @Author mjlft
 * @Date 2020/5/24 22:39
 * @Version 1.0
 * @Description SqlSession管理器
 */
public interface SqlSessionFactory {

    /**
     * 通过Configuration进行sqlSession构建
     * 需要注意的是：这个方法非常重要， 其实在SqlSessionFactory中
     * 最后所有关于SqlSession的创建都会由这个方法实现
     *
     * 进行方法重载的原因是我们的配置信息可能来自不同的配置方法
     * 比如json配置， 注解配置， 网络等等
     * @param configuration
     * @return
     */
    SqlSession buildSqlSession(Configuration configuration);

    /**
     * 通过流获取配置信息， 从流中拿到配置信息Configuration类对象，最后调用buildSqlSession(Configuration configuration)
     * @param inputStream
     * @return
     */
    SqlSession buildSqlSession(InputStream inputStream) throws IOException;

    /**
     * 通过注解方式拿到配置类信息， 最后调用buildSqlSession(Configuration configuration)
     * 这里需要注意，传入的参数是注解扫描基本路径，
     * 也就是在这个配置路径下的所有类都会被扫描， 如果满足我们配置的配置注解配置， 那么我们将解析注解配置信息
     * @param basePath
     * @return
     */
    SqlSession buildSqlSession(String basePath);

    /**
     * 混合配置类型
     * @param inputStream
     * @param basePath
     * @return
     */
    SqlSession buildSqlSession(InputStream inputStream, String basePath);
}
